Combine 提供了宣告形式的 Swift API,主要處理隨時間處理值變化(各種異步行程產出的事件)。發布者(publisher) 產出可隨時間變化的值,訂閱者(subscriber) 從發布者接收這些值。
Publisher 的角色是提供數據, 不論是被動請求或是主動提供. 其中有兩個 container 泛型, Output 與 Failure. subscriber 同時也有泛型, Input 與 Failure. Publishers 和 subscribers 必須互相連接才能運作. 而當連接一個 subscriber 到 任何 publisher 時, 所有相對應的資料型別都必須相同: Output 與 Input 對應, Failure 對應 Failure.
Publisher source Subscriber
+--------------+ +--------------+
| <Output> --> <Input> |
| <Failure> --> <Failure> |
+--------------+ +--------------+
而 operator 則是 publisher 之間的轉換器(adoptor), 可以訂閱一個 publisher, 也可以讓任何 subscriber 要求數據.
甚至可以產出 publisher 鏈(chain).
Publisher source Operator Subscriber
+------------------------+ +------------+ +------------------------+
| <Output> --> <Input> map <Output> --> <Input> |
| <Failure> --> <Failure> function <Failure> --> <Failure> |
+------------------------+ +------------+ +------------------------+
這些組合完成的序列結構, 稱為 pipelines(管路).
Operators 可以轉換 publisher 與 subscriber 之間的數據, 分流或集合流.
import Combine
let publisher = Just(5)
let publisherString = publisher.map{$0.description}
let publisherDouble = publisher.map{Double($0)}
let subcriber = publisher.sink(receiveValue: {print($0)}) // 5
let anotherScriber = publisherDouble.sink(receiveValue: {print("Another",$0)}) //Another 5.0
當面對一個 pipelines 時, 可以將他看成一串 operations 彼此串接型別的序列.
Combine 中的 operators 具備相對應的轉換功能來達成特殊的轉換. 例如 map 是單純轉換 Input, 而 tryMap 是同時間傳換 Input 與 Failure, 像是 Never 轉換成 Decode Error.
上面的例子將 Publisher <Int, Never>
, 分別轉換成 Publisher<String,Never>
與 Publisher<Double,Never>
參考來源: Using Combine: https://heckj.github.io/swiftui-notes/#core-publisher-subscriber
簡單測驗:
timer
的文件delay
的文件whoami:
我是游諭, ytyubox